package com.cskaoyan.javase.basic._2variable._3notice;

/**
 * 浮点数的精度问题
 * 浮点数之所以存在精度问题,根源是因为尾数的位数是有限的
 * 但除此之外,也和小数本身有关系
 *
 * 十进制在表示小数时,经常会出现无限循环的情况,比如10/3,就是一个无限循环小数
 * 到了二进制当中,二进制小数也可能出现无限循环的情况
 * 典型的就是二进制小数0.1
 * 十进制的0.1如何转换成二进制的0.1呢?
 * 十进制正小数（0.开头）转换成二进制，先用小数部分乘以2，取结果的整数部分(必然是1或者0)，
 * 然后小数部分继续乘2
 * 直到小数部分为0，或者已经达到了最大的位数
 * 最终的结果（0.开头）正序排列
 * 0.1 --> 二进制0.1
 * 0.1 * 2 = 0.4 ---> 0
 * 0.4 * 2 = 0.8 ---> 0
 * 0.8 * 2 = 1.6 ---> 1
 * 0.6 * 2 = 1.2 ---> 1
 * 0.2 * 2 = 0.4 ---> 0
 * ....
 * 二进制0.1本身就是一个无限循环小数,再加上浮点数本身的有效位数就有限
 * 所以浮点数的0.1用double表示和float表示,完全不是同一个数
 *
 * 以有效位数来说
 * float的有效位数,大概是7~8位
 * double的有效位数,大概16~17位
 *
 * @since 17:08
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo2 {
    public static void main(String[] args) {
        double a = 1 - 0.9;
        System.out.println(a);
        float b = 1 - 0.9F;
        System.out.println(b);

        float c = 0.1F;
        float d = 0.100000000000000000001F;
        System.out.println(c == d);

    }
}
